/*
 * CandidatoParser.cpp
 *
 *  Created on: Oct 15, 2011
 *      Author: lore
 */

#include "CandidatoParser.h"

CandidatoParser::CandidatoParser() {
}

CandidatoParser::~CandidatoParser() {
}

vector<Candidato> CandidatoParser::parse(string filePath, unsigned long* registrosOK, unsigned long* registrosFAIL){
	vector<Candidato> candidatosParseados;
	(*registrosFAIL) = 0;
	(*registrosOK) = 0;

	fstream _file;
	_file.open(filePath.c_str(),ios::out | ios::in);

	if (!_file.is_open()) {
	}
	else {
		/*
		 * Toma de a una linea
		 */
		string aLine;
		while (getline(_file, aLine)) {
			/*
		 	* Las lineas son del estilo:
		 	* 1|2|3
		 	* Las cuales representan los id. de
		 	* idlista|idvotante|idcargo
		 	*
		 	*/
			unsigned long idlista = -1;
			unsigned long idvotante= -1;
			unsigned long idcargo= -1;

			// limpio "aLine
			StringUtils su;
			aLine = su.replaceAllOccurences(aLine,"\r"," ");
			aLine = su.replaceAllOccurences(aLine,"\n"," ");
			su.trim(aLine);

			if (aLine.length() == 0) {
				continue;
			}

			size_t separator = aLine.find_first_of('|', 0);
						
			if (separator == string::npos) {
				(*registrosFAIL)++;
				continue;
			}
			

			/// candidato
			///// DNI VOTANTE
			///// ID LISTA
			///// ID CARGO


			string idTextvotante = aLine.substr(0,separator);
			size_t separator2 = aLine.find_first_of('|', separator+1);
			
			string idTextlista = aLine.substr(separator+1, separator2-separator-1);

			string idTextcargo = aLine.substr(separator2+1);
			
			/*
			 * Paso a unsigned long los campos tomados del archivo
			 */
			idlista = strtoul(idTextlista.c_str(),NULL,0);
			idvotante = strtoul(idTextvotante.c_str(),NULL,0);
			idcargo = strtoul(idTextcargo.c_str(),NULL,0);
			
			if ((idlista <= 0)|| (idvotante <= 0) || (idcargo <= 0)) {
				(*registrosFAIL)++;
				continue;
			}
			/*
			 * Creo el objeto candidato
			 */
			Candidato candidato;
			candidato.setIdLista(idlista);
			candidato.setIdVotante(idvotante);
			candidato.setIdCargo(idcargo);
			
			candidatosParseados.push_back(candidato);
			(*registrosOK)++;
			}
	}
	return candidatosParseados;
}
